package cinvestav.adviseme.bean;

import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.springframework.security.context.SecurityContextHolder;

import cinvestav.adviseme.controller.SolicitudController;
import cinvestav.adviseme.datamodel.Persona;
import cinvestav.adviseme.datamodel.Solicitud;
import cinvestav.adviseme.util.DBException;
import cinvestav.adviseme.util.DataBaseDictionary;
import cinvestav.adviseme.util.SortableList;

import com.icesoft.faces.component.ext.RowSelectorEvent;

/**
*
* @author Javier Silva Pérez
*/
public class PendingRequestsViewBean extends SortableList{

	 //<editor-fold defaultstate="collapsed" desc="Atributos de Clase">
    protected SolicitudController solicitudController;
    /**
     * Lista de Solicitudes Pendientes mostradas en la pagina
     */
    protected List<Solicitud> solicitudesPendientes;
    /**
     * Solicitud Seleccionada
     */
    protected Solicitud solicitudSeleccionada;    
    
    private String errorMsg;
    private Boolean withConfirmation = true;
    
    //</editor-fold>
	

    //<editor-fold defaultstate="collapsed" desc="Metodos de Ordenamiento">
    /**
     * Metodo de ordenamiento, declara un comparador y ordena la lista deacuerdo a este
     */
    protected void sort() {
        if ((ascending != oldAscending)
                || (!sortColumnName.equals(oldSort))) {

            Comparator comparator = new Comparator() {

                public int compare(Object o1, Object o2) {
                    Solicitud c1 = (Solicitud) o1;
                    Solicitud c2 = (Solicitud) o2;
                    if (sortColumnName == null) {
                        return 0;
                    }
                    //Si la columna a ordenar es la de ID
                    if (sortColumnName.equals("idSort")) {
                        //Se pregunta si es orden ascendente o descendente
                        //y se compara el valor de los objetos en el ID
                        return ascending
                                ? Integer.valueOf(c1.getId()).compareTo(Integer.valueOf(c2.getId()))
                                : Integer.valueOf(c2.getId()).compareTo(Integer.valueOf(c1.getId()));
                    } else if (sortColumnName.equals("nombreSort")) {
                        //Si la columna a ordenar es la de nombre
                        //Se compara el nombre almacenado en los objetos
                        return ascending
                                ? c1.getSolicitante().getNombreCompleto().compareTo(c2.getSolicitante().getNombreCompleto())
                                : c2.getSolicitante().getNombreCompleto().compareTo(c1.getSolicitante().getNombreCompleto());
                    } else if (sortColumnName.equals("fechaSort")) {
                        //Si la columna a ordenar es la de nombre
                        //Se compara el nombre almacenado en los objetos
                        return ascending
                                ? c1.getFechaSolicitud().compareTo(c2.getFechaSolicitud())
                                : c2.getFechaSolicitud().compareTo(c1.getFechaSolicitud());
                    } else {
                        return 0;
                    }
                }
            };

            Collections.sort(solicitudesPendientes, comparator);

            // reset dirty flags.
            oldAscending = ascending;
            oldSort = sortColumnName;
            for (Solicitud r : solicitudesPendientes) {
                r.setSelected(false);
            }
            solicitudSeleccionada = new Solicitud();
        }
    }
    //</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Gets y Sets">
    /**
     * Obtiene la lista de solicituds
     * @return  ArrayList con las solicituds
     */
    public List getSolicitudesPendientes() {
        sort();
        return solicitudesPendientes;
    }

	/**
     * Set del Controlador de Solicitud de Autobuses, manda llamar al metodo de
     * inicializacion
     * @param solicitudController
     */
    public void setSolicitudController(SolicitudController solicitudController) {
        this.solicitudController = solicitudController;
        init();
    }
    
    public SolicitudController getSolicitudController() {
		return solicitudController;
	}


    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public Solicitud getSolicitudSeleccionada() {
        return solicitudSeleccionada;
    }

    public void setSolicitudSeleccionada(Solicitud solicitudSeleccionada) {
        this.solicitudSeleccionada = solicitudSeleccionada;
    }

    public Boolean getWithConfirmation() {
		return withConfirmation;
	}

	public void setWithConfirmation(Boolean withConfirmation) {
		this.withConfirmation = withConfirmation;
	}

	//</editor-fold>
    /** Creates a new instance of SolicitudBuscadorViewBean */
    public PendingRequestsViewBean() {
        super("idSort");        
        solicitudesPendientes = new LinkedList<Solicitud>();
        solicitudSeleccionada = new Solicitud();
        //solicitudController = new SolicitudController();
    }

    /**
     * Inicializa la lista de todas las solicituds
     */
    public void init() {
        try {
        	//Aqui iria el objeto de la persona logueada.
        	Persona solicitado= new Persona();
        	String userName = SecurityContextHolder.getContext().getAuthentication().getName();
        	String userID = "0";
			if(userName!=null){
				userID = userName.substring(userName.lastIndexOf("@")+1);
				Integer id = Integer.parseInt(userID);
				solicitado.setId(id);
			}
        	Map<String,String[]> queryMap = new HashMap<String,String[]>();
        	String values[] = new String[3];
        	                
        	values[0] = String.valueOf(solicitado.getId());
        	values[1] = DataBaseDictionary.COLUMN_TYPE_SOLICITUD_ID_DESTINO;
        	values[2] = DataBaseDictionary.ALIAS_SOLICITUD;
        	
        	queryMap.put(DataBaseDictionary.COLUMN_FILTRO_NAME_SOLICITUD_ID_DESTINO, values);
        	
        	values[0] = userID;
        	values[1]= DataBaseDictionary.COLUMN_TYPE_SOLICITUD_ESTADO;
        	values[2] = DataBaseDictionary.ALIAS_SOLICITUD;
        	
        	queryMap.put(DataBaseDictionary.COLUMN_FILTER_NAME_SOLICITUD_ESTADO, values);
        	
            solicitudesPendientes = solicitudController.getByFilters(queryMap);            
        } catch (DBException ex) {
            
        }
    }

    /**
     * Funcion que realiza la busqueda de Lineas de Autobus deacuerdo a los filtros
     * seleccionados en la interfaz
     */
    public void buscar() {

    }
    
    public void aceptarSolicitudes(){
    	 FacesContext context = FacesContext.getCurrentInstance();
         //Se valida que se haya seleccionado una Ruta en la tabla
         if (solicitudSeleccionada.getId() == null || solicitudSeleccionada.getId() == 0) {
             FacesMessage message = new FacesMessage();
             message.setSeverity(FacesMessage.SEVERITY_ERROR);
             message.setSummary("Debe seleccionar una Solicitud");
             message.setDetail("Debe seleccionar una Solicitud");
             context.addMessage("GeneralForm:icePnlTbSet:0:btnAceptar_PendingRequests", message);
             return;
         }
         try {
             //Se realiza la actualizacion en la base;
        	 Calendar fecha = Calendar.getInstance();        	 
        	 
        	 solicitudSeleccionada.setEstado(2);
        	 solicitudSeleccionada.setFechaRespuesta(fecha.get(Calendar.YEAR)+"/"+
                	 fecha.get(Calendar.MONTH)+"/"+
                	 fecha.get(Calendar.DATE));
        	 solicitudController.update(solicitudSeleccionada);
        	 solicitudSeleccionada = new Solicitud();
        	 errorMsg="";
             init();             
         } catch (DBException ex) {
             FacesMessage msg = new FacesMessage(ex.getMessage() + ex.getErrorConsulta().getMessage());
             context.addMessage("GeneralForm:icePnlTbSet:0:btnAceptar_PendingRequests", msg);
         }
    }
    
    public void rechazarSolicitudes(){
   	 FacesContext context = FacesContext.getCurrentInstance();
     //Se valida que se haya seleccionado una Ruta en la tabla
     if (solicitudSeleccionada.getId() == null || solicitudSeleccionada.getId() == 0) {
         FacesMessage message = new FacesMessage();
         message.setSeverity(FacesMessage.SEVERITY_ERROR);
         message.setSummary("Debe seleccionar una Solicitud");
         message.setDetail("Debe seleccionar una Solicitud");
         context.addMessage("GeneralForm:icePnlTbSet:0:btnAceptar_PendingRequests", message);
         return;
     }
     try {
         //Se realiza la actualizacion en la base;
    	 Calendar fecha = Calendar.getInstance();        	 
    	 
    	 solicitudSeleccionada.setEstado(3);
    	 solicitudSeleccionada.setFechaRespuesta(fecha.get(Calendar.YEAR)+"/"+
            	 fecha.get(Calendar.MONTH)+"/"+
            	 fecha.get(Calendar.DATE));
    	 solicitudController.update(solicitudSeleccionada);
    	 solicitudSeleccionada = new Solicitud();
    	 errorMsg="";
         init();             
     } catch (DBException ex) {
         FacesMessage msg = new FacesMessage(ex.getMessage() + ex.getErrorConsulta().getMessage());
         context.addMessage("GeneralForm:icePnlTbSet:0:btnAceptar_PendingRequests", msg);
     }
    }

    /**
     * SelectionListener esta relacionado con el componente  ice:rowSelector
     * es llamado cuando una fila es seleccionada en la UI
     *
     * @param event Evento del componente ice:rowSelector
     */
    public void rowSelectionListener(RowSelectorEvent event) {
        // build the new selected list
        Solicitud solicitudAux;
        for (int i = 0, max = solicitudesPendientes.size(); i < max; i++) {
            solicitudAux = (Solicitud) solicitudesPendientes.get(i);
            //Se ubica la linea seleccionada y se inicializa el objeto que la contendra
            if (solicitudAux.getSelected()) {
                solicitudSeleccionada = new Solicitud(solicitudAux);
                //solicitudSeleccionadaModificar = new Solicitud((Solicitud) rutaAux);
            }
        }
    }




}
